# -*- coding: utf-8 -*-

import logging

# pip install apscheduler
from apscheduler.schedulers.blocking import BlockingScheduler

"""
apscheduler基于quartz


trigger='date','interval','cron':触发配置
--------------
(int|str) 表示参数既可以是int类型，也可以是str类型
(datetime | str) 表示参数既可以是datetime类型，也可以是str类型

日期时间格式
yyyy-MM-dd
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm:ss,SSS

特殊格式
*
*/x
a,b,c,d
m-n
m-n/x
(week-of-month)th (day-of-week):每月中第几周的星期几执行
last:每月的最后一天执行
last day-of-month:每月的倒数第几天执行

trigger='cron'
--------------
year (int|str) – 4-digit year -（表示四位数的年份，如2008年）
month (int|str) – month (1-12) -（表示取值范围为1-12月）
day (int|str) – day of the (1-31) -（表示取值范围为1-31日）
week (int|str) – ISO week (1-53) -（格里历2006年12月31日可以写成2006年-W52-7（扩展形式）或2006W527（紧凑形式））
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - （表示一周中的第几天）
hour (int|str) – hour (0-23) - （表示取值范围为0-23时）
minute (int|str) – minute (0-59) - （表示取值范围为0-59分）
second (int|str) – second (0-59) - （表示取值范围为0-59秒）
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive) - （表示开始时间）
end_date (datetime|str) – latest possible date/time to trigger on (inclusive) - （表示结束时间）
timezone (datetime.tzinfo|str) –  (defaults to scheduler timezone) -（表示时区取值）


trigger='interval':间隔多久执行
--------------
weeks (int) – number of weeks to wait
days (int) – number of days to wait
hours (int) – number of hours to wait
minutes (int) – number of minutes to wait
seconds (int) – number of seconds to wait
start_date (datetime|str) – starting point for the interval calculation
end_date (datetime|str) – latest possible date/time to trigger on
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations



trigger='date':指定准确触发日期时间
--------------

run_date (datetime|str)
timezone (datetime.tzinfo|str)




"""
scheduler = BlockingScheduler()  # 阻塞型调度器
job_id = 'job_id'


def job(*args, **kwargs):
    logging.info(args)
    print(kwargs)
    pass


@scheduler.scheduled_job(trigger='date', run_date='2022-03-19 17:19:56')
def job_func():
    logging.info('job_func')

    # 获取所有任务
    jobs = scheduler.get_jobs()
    # 获取单个任务
    job = scheduler.get_job(job_id=job_id)
    # 暂停任务
    job.pause()
    # 恢复任务
    job.resume()

    # 重新设置调度
    job.reschedule(trigger='cron', year=2022, month=3, day=19, hour=17, minute='*', second=23)

    # 删除任务
    # job.remove()
    # scheduler.remove_job(job_id=job_id)

    # 终止调度：默认要等所有正在触发的任务才终止
    # scheduler.shutdown()
    scheduler.shutdown(wait=False)


    pass


if __name__ == '__main__':
    # 设置日志格式
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s - [%(levelname)s] - {%(pathname)s:%(lineno)d} (%(funcName)s) - %(message)s')
    # 添加任务
    scheduler.add_job(func=job, args=('str1', 'str2'), kwargs={"key1": "value2"},
                      trigger='interval', seconds=3,
                      start_date='2021-05-30', end_date='2022-05-30',
                      id=job_id)

    # 启动调度
    scheduler.start()
    pass
